Django CMS 教程

1. Django 简介和特性

Django 是一个高级 Python Web 框架,鼓励快速开发和简洁、实用的设计。它遵循 MVT(Model-View-Template)架构,提供了许多内置功能,如用户认证、内容管理、表单处理、文件上传等。

主要特性

  • ORM(对象关系映射):简化数据库操作。
  • Admin 后台:自动生成管理界面。
  • 表单处理:简化表单创建和验证。
  • 安全性:内置 CSRF 保护、XSS 防御等。

2. 安装和环境设置

安装 Django

pip install django

创建项目

django-admin startproject myproject
cd myproject

运行开发服务器

python manage.py runserver

3. 项目结构和管理命令

项目结构

myproject/
    manage.py
    myproject/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

常用管理命令

  • 创建应用:python manage.py startapp myapp
  • 数据库迁移:python manage.py makemigrations 和 python manage.py migrate
  • 创建超级用户:python manage.py createsuperuser

4. MVT (Model-View-Template) 架构

Model

  • 定义数据结构和数据库操作。
  • 示例:
    from django.db import models
    
    class Article(models.Model):
        title = models.CharField(max_length=200)
        content = models.TextField()
        pub_date = models.DateTimeField('date published')
    

View

  • 处理请求并返回响应。
  • 示例:
    from django.http import HttpResponse
    
    def home_view(request):
        return HttpResponse("Hello, Django!")
    

Template

  • 渲染 HTML 页面。
  • 示例:
    <html>
    <body>
        <h1>{{ title }}</h1>
        <p>{{ content }}</p>
    </body>
    </html>
    

5. 第一个 Django 应用

创建应用

python manage.py startapp myapp

定义模型

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField('date published')

创建视图

from django.shortcuts import render
from .models import Article

def article_list(request):
    articles = Article.objects.all()
    return render(request, 'myapp/article_list.html', {'articles': articles})

配置 URL

from django.urls import path
from . import views

urlpatterns = [
    path('articles/', views.article_list, name='article_list'),
]

6. 模型定义和字段类型

常用字段类型

  • CharField:字符串字段。
  • TextField:文本字段。
  • DateTimeField:日期时间字段。
  • IntegerField:整数字段。

示例

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField('date published')
    views = models.IntegerField(default=0)

7. 数据库迁移

创建迁移文件

python manage.py makemigrations

应用迁移

python manage.py migrate

8. 查询集和管理器

查询集

  • 用于从数据库中获取数据。
  • 示例:
    articles = Article.objects.filter(pub_date__year=2023)
    

管理器

  • 自定义查询集。
  • 示例:
    class PublishedManager(models.Manager):
        def get_queryset(self):
            return super().get_queryset().filter(pub_date__lte=timezone.now())
    
    class Article(models.Model):
        objects = models.Manager()
        published = PublishedManager()
    

9. 模型关系 (一对多、多对多)

一对多关系

class Author(models.Model):
    name = models.CharField(max_length=100)

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField('date published')
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

多对多关系

class Tag(models.Model):
    name = models.CharField(max_length=100)

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField('date published')
    tags = models.ManyToManyField(Tag)

10. 自定义模型方法

示例

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField('date published')

    def is_published(self):
        return self.pub_date <= timezone.now()

11. 函数视图和类视图

函数视图

def article_detail(request, article_id):
    article = get_object_or_404(Article, id=article_id)
    return render(request, 'myapp/article_detail.html', {'article': article})

类视图

from django.views import View

class ArticleDetailView(View):
    def get(self, request, article_id):
        article = get_object_or_404(Article, id=article_id)
        return render(request, 'myapp/article_detail.html', {'article': article})

12. URL 模式和命名

示例

from django.urls import path
from . import views

urlpatterns = [
    path('articles/', views.article_list, name='article_list'),
    path('articles/<int:article_id>/', views.article_detail, name='article_detail'),
]

13. 视图参数和请求处理

示例

def article_detail(request, article_id):
    article = get_object_or_404(Article, id=article_id)
    return render(request, 'myapp/article_detail.html', {'article': article})

14. 通用视图

示例

from django.views.generic import ListView, DetailView
from .models import Article

class ArticleListView(ListView):
    model = Article
    template_name = 'myapp/article_list.html'
    context_object_name = 'articles'

class ArticleDetailView(DetailView):
    model = Article
    template_name = 'myapp/article_detail.html'
    context_object_name = 'article'

15. 中间件

示例

from django.utils.deprecation import MiddlewareMixin

class CustomMiddleware(MiddlewareMixin):
    def process_request(self, request):
        print("Request received")

16. 模板语法和标签

示例

<html>
<body>
    <h1>{{ article.title }}</h1>
    <p>{{ article.content }}</p>
    <p>Published on: {{ article.pub_date }}</p>
</body>
</html>

17. 模板继承

基础模板

<!-- base.html -->
<html>
<body>
    {% block content %}{% endblock %}
</body>
</html>

子模板

<!-- article_detail.html -->
{% extends 'base.html' %}

{% block content %}
    <h1>{{ article.title }}</h1>
    <p>{{ article.content }}</p>
    <p>Published on: {{ article.pub_date }}</p>
{% endblock %}

18. 上下文处理器

示例

def custom_context(request):
    return {'custom_var': 'Custom Value'}

19. 自定义模板标签和过滤器

示例

from django import template

register = template.Library()

@register.filter
def upper_case(value):
    return value.upper()

20. 静态文件处理

配置

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    BASE_DIR / "static",
]

使用

<link rel="stylesheet" href="{% static 'css/style.css' %}">

21. Django Form 类

示例

from django import forms

class ArticleForm(forms.Form):
    title = forms.CharField(max_length=200)
    content = forms.CharField(widget=forms.Textarea)

22. 表单验证

示例

class ArticleForm(forms.Form):
    title = forms.CharField(max_length=200)
    content = forms.CharField(widget=forms.Textarea)

    def clean_title(self):
        title = self.cleaned_data['title']
        if len(title) < 5:
            raise forms.ValidationError("Title must be at least 5 characters long.")
        return title

23. ModelForm

示例

from django.forms import ModelForm
from .models import Article

class ArticleForm(ModelForm):
    class Meta:
        model = Article
        fields = ['title', 'content']

24. 表单集 (Formsets)

示例

from django.forms import formset_factory
from .forms import ArticleForm

ArticleFormSet = formset_factory(ArticleForm, extra=2)

25. 文件上传处理

示例

from django import forms

class UploadFileForm(forms.Form):
    title = forms.CharField(max_length=50)
    file = forms.FileField()

26. 用户认证系统

示例

from django.contrib.auth import authenticate, login

def login_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return redirect('home')
        else:
            return render(request, 'login.html', {'error': 'Invalid credentials'})
    return render(request, 'login.html')

27. 自定义用户模型

示例

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    bio = models.TextField(max_length=500, blank=True)

28. 权限和组

示例

from django.contrib.auth.models import Group, Permission

group = Group.objects.create(name='Editors')
permission = Permission.objects.get(codename='add_article')
group.permissions.add(permission)

29. 登录、注销和注册视图

示例

from django.contrib.auth import login, logout
from django.contrib.auth.forms import UserCreationForm

def register_view(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('login')
    else:
        form = UserCreationForm()
    return render(request, 'register.html', {'form': form})

def logout_view(request):
    logout(request)
    return redirect('home')

30. 基于类的权限控制

示例

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import View

class ProtectedView(LoginRequiredMixin, View):
    def get(self, request):
        return HttpResponse("Protected content")

31. Admin 站点定制

示例

from django.contrib import admin
from .models import Article

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title', 'pub_date', 'author')
    list_filter = ('pub_date', 'author')
    search_fields = ('title', 'content')

32. 模型注册和配置

示例

from django.contrib import admin
from .models import Article

admin.site.register(Article)

33. 自定义 Admin 操作

示例

from django.contrib import admin
from .models import Article

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    actions = ['make_published']

    def make_published(self, request, queryset):
        queryset.update(status='p')
    make_published.short_description = "Mark selected articles as published"

34. Admin 主题和样式

示例

from django.contrib import admin

admin.site.site_header = "My Custom Admin"
admin.site.site_title = "My Custom Admin Portal"
admin.site.index_title = "Welcome to My Custom Admin Portal"

35. 权限和分组管理

示例

from django.contrib.auth.models import Group, Permission

group = Group.objects.create(name='Editors')
permission = Permission.objects.get(codename='add_article')
group.permissions.add(permission)

36. 会话框架

示例

def set_session(request):
    request.session['favorite_color'] = 'blue'
    return HttpResponse("Session set")

def get_session(request):
    favorite_color = request.session.get('favorite_color', 'unknown')
    return HttpResponse(f"Favorite color: {favorite_color}")

37. Cookie 处理

示例

def set_cookie(request):
    response = HttpResponse("Cookie set")
    response.set_cookie('favorite_color', 'blue')
    return response

def get_cookie(request):
    favorite_color = request.COOKIES.get('favorite_color', 'unknown')
    return HttpResponse(f"Favorite color: {favorite_color}")

38. 用户状态管理

示例

def user_status(request):
    if request.user.is_authenticated:
        return HttpResponse(f"Welcome, {request.user.username}")
    else:
        return HttpResponse("Please log in")

39. 购物车实现

示例

from django.shortcuts import render, redirect
from .models import Product

def add_to_cart(request, product_id):
    product = Product.objects.get(id=product_id)
    cart = request.session.get('cart', {})
    cart[product_id] = cart.get(product_id, 0) + 1
    request.session['cart'] = cart
    return redirect('cart')

def view_cart(request):
    cart = request.session.get('cart', {})
    products = Product.objects.filter(id__in=cart.keys())
    return render(request, 'cart.html', {'cart': cart, 'products': products})

40. 缓存后端配置

示例

CACHES = {
    'default': {
        'BACKEND': 'django